from kedro.pipeline import Pipeline, node, pipeline

from .nodes import evaluate_model, split_data, train_model
# 这个文件是新增了 namespace 后的版本
# 要看不带 namespace 的简单版本，请看 pipeline.bak

def create_pipeline(**kwargs) -> Pipeline:

    # 这一部份和不用namespace的写法完全一样
    pipeline_instance = pipeline(
        [
            node(
                func=split_data,

                #params:model_options 会根据 namespace 自动读取对应的参数配置
                #如果用了 namespace，节点里的 params:model_options 实际会被解析为：
                # params:active_modelling_pipeline.model_options（对于 active_modelling_pipeline namespace）
                # params:candidate_modelling_pipeline.model_options（对于 candidate_modelling_pipeline namespace）
                inputs=["model_input_table", "params:model_options"],

                # 在实例化时 X_train 会变成 active_modelling_pipeline.X_train
                outputs=["X_train", "X_test", "y_train", "y_test"],
                name="split_data_node",
            ),
            node(
                func=train_model,
                inputs=["X_train", "y_train"],
                outputs="regressor",
                name="train_model_node",
            ),
            node(
                func=evaluate_model,
                inputs=["regressor", "X_test", "y_test"],
                outputs=None,
                name="evaluate_model_node",
            ),
        ]
    )

    """
    注意， 上面的 model_input_table 不会被带上命名空间前缀
    只有 pipeline 内部产生的新数据（如 X_train、regressor）才会自动加上命名空间前缀
    """

    """
    这里就是在实例化 pipeline, 将这个模板 pipeline_instance实例化了两次， 变成两个不同的 pipeline。
    用 namespace（命名空间）把同一个 pipeline 实例包装成两个不同的 pipeline。
    这样可以在同一个项目里并行运行两个类似的流程，互不干扰。
  
    """
    ds_pipeline_1 = pipeline(
        #官方文档中说这样写： pipe=pipeline_instance,  已不适用于新版本了。需要去掉 pipe=
        pipeline_instance,
        inputs="model_input_table", # 在这里可以不写这个inputs，它会自动从 node 里找输入。但最好是写上，方便以后切换不同的输入数据集。
        namespace="active_modelling_pipeline",
    )
    ds_pipeline_2 = pipeline(
        pipeline_instance,
        inputs="model_input_table",
        namespace="candidate_modelling_pipeline",
    )

    """
    在 Kedro 中，使用 + 号连接两个 pipeline（如 ds_pipeline_1 + ds_pipeline_2），
    表示把这两个 pipeline 合并成一个新的 pipeline。
    这样 Kedro 会把两个 pipeline 里的所有节点都放在一起运行，相当于把它们的流程拼接到一起，形成一个更大的 pipeline。
    """
    return ds_pipeline_1 + ds_pipeline_2